/**
 * Endereco.java
 * Copyright (C) 2009 Jose Mauro da Silva Sandy
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

package negocio.pessoas;

import java.io.IOException;
import persistencia.pessoas.PEndereco;
import utils.*;

/**
 *
 * @author jmsandy
 */
public class Endereco {

    // <editor-fold defaultstate="collapsed" desc="FIELDS">
    private String cod_objeto;
    private String logradouro;
    private String cidade;
    private int estado;
    private int numero;
    private String bairro;
    private String complemento;
    private String cep;
    private String pessoa;
    private Boolean update;
    private Boolean isNew = true;
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="ACESSORES">
    // Atributo cod_objeto
    public String getCod_objeto() {
        return cod_objeto; }
    public void setCod_objeto(String cod_objeto) {
        this.cod_objeto = cod_objeto; }
    // Atributo logradouro
    public String getLogradouro() {
        return logradouro; }
    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro; }
    // Atributo cidade
    public String getCidade() {
        return cidade; }
    public void setCidade(String cidade) {
        this.cidade = cidade; }
    // Atributo estado
    public int  getEstado() {
        return estado; }
    public void setEstado(int estado) {
        this.estado = estado; }
    // Atributo numero
    public int getNumero() {
        return numero; }
    public void setNumero(int numero) {
        this.numero = numero; }
    // Atributo bairro
    public String getBairro() {
        return bairro; }
    public void setBairro(String bairro) {
        this.bairro = bairro; }
    // Atributo complemento
    public String getComplemento() {
        return complemento; }
    public void setComplemento(String complemento) {
        this.complemento = complemento; }
    // Atributo cep
    public String getCep() {
        return cep; }
    public void setCep(String cep) {
        this.cep = cep; }
    // Atributo pessoa
    public String getPessoa() {
        return pessoa; }
    public void setPessoa(String pessoa) {
        this.pessoa = pessoa; }
    // Atributo update
    public Boolean getWasUpdated() {
        return update; }
    public void setWasUpdated(Boolean update) {
        this.update = update; }
    // Atributo isNew
    public Boolean getIsNew() {
        return isNew; }
    public void setIsNew(Boolean isNew) {
        this.isNew = isNew; }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Constructor">
    public Endereco(){
        this.update = false;
        this.isNew = true;
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="METHODS">
    /**
     * Verifica se um objeto e novo
     * @return retorna verdadeiro se o objeto for novo
     */
    public Boolean isNew(){
        return this.isNew;
    }

    /**
     * Realiza a insercao de um objeto na base de dados
     * @return TRUE se o objeto foi persistido e FALSE caso contrario
     */
    public Boolean insert() throws IOException{
        Boolean ret = true;

        // Verifica se um objeto pode ser inserido no banco de dados
        if(validateFields()){
            PEndereco pEndereco = new PEndereco();

            // Verifica se o objeto foi inserido com sucesso
            if(!pEndereco.insert(this)){
                ret = false;
            }
            else{
                this.update = true;
                this.isNew = false;
            }
        }
        else ret = false;

        return ret;
    }

    /**
     * Realiza a atualizacao de um objeto na base de dados
     * @return TRUE se o objeto foi persistido e FALSE caso contrario
     */
    public Boolean update() throws IOException{
        Boolean ret = true;

        // Verifica se um objeto pode ser inserido no banco de dados
        this.update = true;
        if(validateFields()){
            PEndereco pEndereco = new PEndereco();

            // Verifica se o objeto foi inserido com sucesso
            if(!pEndereco.update(this)) ret = false;
            else{
                this.update = true;
                this.isNew = false;
            }
        }
        else ret = false;

        return ret;
    }

    /**
     * Realiza a delecao de um objeto na base de dados
     * @return TRUE se o objeto foi persistido e FALSE caso contrario
     */
    public Boolean delete() throws IOException{
        Boolean ret = true;

        // Verifica se um objeto e novo
        if(!this.isNew()){
            PEndereco pEndereco = new PEndereco();

            // Verifica se o objeto foi deletado com sucesso
            if(!pEndereco.delete(this)) ret = false;
        }
        else ret = false;

        return ret;
    }

    /**
     * Recupera um endereco pelo seu cod_objeto
     * @param cod_objeto - codigo do endereco a ser recuperado
     * @return o endereco recuperado
     */
    public Endereco refresh(String cod_objeto){
        Endereco endereco = null;

        try{
            // Verifica se foi informado algum codigo
            if(!cod_objeto.isEmpty()){
                // Recupera o endereco em questao
                PEndereco pEndereco = new PEndereco();
                endereco = new Endereco();

                endereco = pEndereco.refresh(cod_objeto);
            }
        }catch(Exception ex){
            ex.printStackTrace();
            endereco = null;
        }
        return endereco;
    }

    /**
     * Recupera um endereco para uma pessoa
     * @param idPessoa identificador da pessoa
     * @return o endereco recuperado
     */
    public Endereco recEnderecoPessoa(String idPessoa){
        Endereco endereco = null;

        try{
            // Recupera o endereco em questao
            PEndereco pEndereco = new PEndereco();
            endereco = new Endereco();

            endereco = pEndereco.recEnderecoPessoa(idPessoa);
        }catch(Exception ex){
            ex.printStackTrace();
            endereco = null;
        }
        return endereco;
    }

    // Realiza a validacao dos campos para insercao
    public Boolean validateFields(){
        Boolean ret = true;

        // Verifica se o campo esta marcado como atualizado
        if(this.isNew()) this.cod_objeto = GenerateID.gerarID();

        // Verifica se foi informado algum logradouro
        if(this.logradouro.isEmpty() || this.logradouro.length() > 50)
            ret = false;

        // Verifica se foi informada alguma cidade
        if(this.cidade.isEmpty() || this.cidade.length() > 30) ret = false;

        // Verifica se foi selecionado um estado
        if(this.estado < 0 || this.estado > 27) ret = false;

        // Verifica se foi informado algum bairro
        if(this.bairro.isEmpty() || this.bairro.length() > 50) ret = false;

        // Verifica se um CEP e valido
        ret = ExpressoesRegulares.cepValido(this.cep);

        return ret;
    }
    //</editor-fold>
}